<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<style id="style">
    #color {
        color: red;
    }
    #visited_color {
        -internal-visited-color: red;
    }
    #visited_color:visited {
        -internal-visited-color: red;
    }
</style>
<div id="container">
    <a href="" id="color"></a>
    <a href="" id="visited_color"></a>
</div>
<script>

const elements = Array.from(container.children);

test(() => {
    for (let element of elements) {
        let names = Array.from(getComputedStyle(element));
        assert_true(names.every(x => !x.startsWith('-internal')));
    }
}, 'Internal properties do not appear in enumeration of computed style (CSSOM)');

test(() => {
    for (let rule of style.sheet.cssRules) {
        let names = Array.from(rule.style);
        assert_true(names.every(x => !x.startsWith('-internal')));
    }
}, 'Internal properties do not appear in enumeration of specified style (CSSOM)');

test(() => {
    for (let element of elements) {
        let cs = getComputedStyle(element);
        assert_equals(cs.getPropertyValue('-internal-visited-color'), '');
        assert_equals(cs['-internal-visited-color'], undefined);
        assert_equals(cs.internalVisitedColor, undefined);
    }
}, '-internal-visited-color does not appear on computed style (CSSOM)');

test(() => {
    for (let rule of style.sheet.cssRules) {
        assert_equals(rule.style.getPropertyValue('-internal-visited-color'), '');
        assert_equals(rule.style['-internal-visited-color'], undefined);
        assert_equals(rule.style.internalVisitedColor, undefined);
    }
}, '-internal-visited-color does not appear on specified style (CSSOM)');

test(() => {
    for (let rule of style.sheet.cssRules) {
        rule.style.setProperty('-internal-visited-color', 'red');
        assert_equals(rule.style.getPropertyValue('-internal-visited-color'), '');
        rule.style['-internal-visited-color'] = 'red';
        assert_equals(rule.style.getPropertyValue('-internal-visited-color'), '');
    }
}, '-internal-visited-color may not be set on specified style (CSSOM)');

test(() => {
    for (let element of elements) {
        let names = Array.from(element.computedStyleMap()).map(x => x[0]);
        assert_true(names.every(x => !x.startsWith('-internal')));
    }
}, 'Internal properties do not appear in enumeration of computed style (CSS Typed OM)');

test(() => {
    for (let rule of style.sheet.cssRules) {
        let names = Array.from(rule.styleMap).map(x => x[0]);
        assert_true(names.every(x => !x.startsWith('-internal')));
    }
}, 'Internal properties do not appear in enumeration of specified style (CSS Typed OM)');

test(() => {
    for (let element of elements) {
        let cs = element.computedStyleMap();
        assert_throws_js(TypeError, () => {
            assert_equals(cs.get('-internal-visited-color'), '');
        }, 'get() should throw when attempting to access internal property');
    }
}, '-internal-visited-color does not appear on computed style (CSS Typed OM)');

test(() => {
    for (let rule of style.sheet.cssRules) {
        assert_throws_js(TypeError, () => {
            assert_equals(rule.styleMap.get('-internal-visited-color'), '');
        }, 'get() should throw when attempting to access internal property');
    }
}, '-internal-visited-color does not appear on specified style (CSS Typed OM)');

test(() => {
    for (let rule of style.sheet.cssRules) {
        assert_throws_js(TypeError, () => {
            assert_equals(rule.styleMap.set('-internal-visited-color'), 'red');
        }, 'set() should throw when attempting to access internal property');
    }
}, '-internal-visited-color may not be set on specified style (CSS Typed OM)');

</script>
